home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LISTS / LISTS4 / LISTS40.DOC < prev    next >
Text File  |  1989-06-25  |  23KB  |  656 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.                                   LISTS version 4.0
  8.  
  9.  
  10.           The LISTS unit is designed to make work with doubly-linked lists
  11.           a whole lot easier.  Now, with Objects and version 4.0 of LISTS,
  12.           LISTS itself has become a whole lot easier.
  13.  
  14.           Please note:  An awful lot of effort has gone into the
  15.           development and testing of LISTS.  If you use LISTS and like it,
  16.           a $15 registration fee is requested.  When registered, you will
  17.           receive the source code to LISTS via CompuServe's EasyPlex.
  18.           Thank you.
  19.  
  20.  
  21.  
  22.                                   Table of Contents
  23.  
  24.                                                                        Page
  25.           Section One: Interface. . . . . . . . . . . . . . . . . . . . 1
  26.           Section Two: ListObj description. . . . . . . . . . . . . . . 2
  27.              F_Entry. . . . . . . . . . . . . . . . . . . . . . . . . . 3
  28.              L_Entry. . . . . . . . . . . . . . . . . . . . . . . . . . 3
  29.              Init . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
  30.              Delete . . . . . . . . . . . . . . . . . . . . . . . . . . 3
  31.              FirstEntry . . . . . . . . . . . . . . . . . . . . . . . . 4
  32.              LastEntry. . . . . . . . . . . . . . . . . . . . . . . . . 4
  33.              EntryAbs . . . . . . . . . . . . . . . . . . . . . . . . . 5
  34.              EntryRel . . . . . . . . . . . . . . . . . . . . . . . . . 5
  35.              MoveEntry. . . . . . . . . . . . . . . . . . . . . . . . . 6
  36.           Section Three: EntryObj description . . . . . . . . . . . . . 7
  37.              P_Entry. . . . . . . . . . . . . . . . . . . . . . . . . . 7
  38.              N_Entry. . . . . . . . . . . . . . . . . . . . . . . . . . 7
  39.              Add. . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
  40.              Insert . . . . . . . . . . . . . . . . . . . . . . . . . . 8
  41.              Remove . . . . . . . . . . . . . . . . . . . . . . . . . . 8
  42.              NextEntry. . . . . . . . . . . . . . . . . . . . . . . . . 9
  43.              PrevEntry. . . . . . . . . . . . . . . . . . . . . . . . . 9
  44.           Examples. . . . . . . . . . . . . . . . . . . . . . . . . .  11
  45.              Static entries . . . . . . . . . . . . . . . . . . . . .  11
  46.              Dynamic entries. . . . . . . . . . . . . . . . . . . . .  12
  47.           Hopes . . . . . . . . . . . . . . . . . . . . . . . . . . .  13
  48.  
  49.  
  50.           LISTS documentation                                        Page 2
  51.  
  52.  
  53.  
  54.           Section One: Interface
  55.           ------------ ---------
  56.           The following describes the Interface section of LISTS (the
  57.           routines that can be called from another program.)  Please note
  58.           that there are no Procedures/Functions per se, but objects and
  59.           methods instead.  This switch from previous versions of LISTS
  60.           makes full use of the new capabilities of TP 5.5 and allows for
  61.           much greater flexibility in using LISTS.
  62.  
  63.           INTERFACE
  64.           Type
  65.            EntryPtr  =  ^EntryObj;
  66.  
  67.            ListObj   =  Object
  68.                           F_Entry  :   EntryPtr;
  69.                           L_Entry  :   EntryPtr;
  70.  
  71.                           Constructor Init;
  72.                           Destructor Done; Virtual;
  73.  
  74.                           Function FirstEntry:EntryPtr; Virtual;
  75.                           Function LastEntry:EntryPtr; Virtual;
  76.                           Function EntryAbs(Num:LongInt):EntryPtr; Virtual;
  77.                           Function EntryRel(Num:LongInt):EntryPtr; Virtual;
  78.                           Procedure MoveEntry(Source, Dest:EntryPtr);
  79.                             Virtual;
  80.                         End;
  81.  
  82.            EntryObj  =  Object
  83.                           P_Entry  :   EntryPtr;
  84.                           N_Entry  :   EntryPtr;
  85.  
  86.                           Constructor Add(Var List:ListObj);
  87.                           Constructor Insert(Var List:ListObj;
  88.                                              Loc:EntryPtr);
  89.                           Destructor Remove(Var List:ListObj);
  90.  
  91.                           Function NextEntry:EntryPtr; Virtual;
  92.                           Function PrevEntry:EntryPtr; Virtual;
  93.                         End;
  94.  
  95.           Notice that all the methods are VIRTUAL, thus allowing the
  96.           programmer to customize the routines.
  97.  
  98.  
  99.           LISTS documentation                                        Page 3
  100.  
  101.  
  102.  
  103.           Section Two: ListObj Description
  104.           ------------ -------------------
  105.           The ListObj is a data type of Object which include two data
  106.           fields (F_Entry and L_Entry, both of which are of type EntryPtr)
  107.           and seven methods (Init, the constructor, Delete, the destructor,
  108.           FirstEntry, LastEntry, EntryAbs, EntryRel, and MoveEntry).  All
  109.           the methods are virtual to allow for simple extensions and
  110.           modifications.
  111.  
  112.                ------------------------------------------------------------
  113.                F_Entry : EntryPtr
  114.                ------------------------------------------------------------
  115.                This data field is a pointer to the first entry in the list.
  116.                It should never be accessed by the programmer; use the
  117.                method FirstEntry instead.
  118.  
  119.  
  120.  
  121.                ------------------------------------------------------------
  122.                L_Entry : EntryPtr
  123.                ------------------------------------------------------------
  124.                This data field is a pointer to the last entry in the list.
  125.                It should never be accessed by the programmer; use the
  126.                method LastEntry instead.
  127.  
  128.  
  129.  
  130.                ------------------------------------------------------------
  131.                Constructor Init
  132.                ------------------------------------------------------------
  133.                This routine initializes the List for processing by setting
  134.                the data fields to NIL and preparing the Virtual Method
  135.                Table (VMT).
  136.  
  137.                Init must be called prior to ANY activity for the List.
  138.  
  139.                Example
  140.                Var
  141.                   List : ListObj;
  142.  
  143.                Begin
  144.                   List.Init;
  145.                End.
  146.  
  147.  
  148.  
  149.                ------------------------------------------------------------
  150.                Destructor Delete
  151.                ------------------------------------------------------------
  152.                This routine does nothing but release the memory used by the
  153.                Virtual Method Table (VMT).
  154.  
  155.                Example
  156.                Var
  157.  
  158.  
  159.           LISTS documentation                                        Page 4
  160.  
  161.  
  162.  
  163.                   List : ListObj;
  164.  
  165.                Begin
  166.                   List.Init;
  167.  
  168.                   ...
  169.  
  170.                   p
  171.                List.Delete;
  172.                End.
  173.  
  174.  
  175.  
  176.                ------------------------------------------------------------
  177.                Function FirstEntry:EntryPtr
  178.                ------------------------------------------------------------
  179.                This function returns a pointer to the first entry in the
  180.                list.  Use this method instead of F_Entry.
  181.  
  182.                This function returns NIL if the List has been Initialized
  183.                and is empty.
  184.  
  185.                Example
  186.                Var
  187.                   List : ListObj;
  188.                   FirstEntryInList : EntryObj;
  189.  
  190.                Begin
  191.                   List.Init;
  192.  
  193.                   ...
  194.  
  195.                   FirstEntryInList:=List.FirstEntry;
  196.                End.
  197.  
  198.  
  199.  
  200.                ------------------------------------------------------------
  201.                Function LastEntry:EntryPtr
  202.                ------------------------------------------------------------
  203.                This function returns a pointer to the first entry in the
  204.                list.  Use this method instead of L_Entry.
  205.  
  206.                This function returns NIL the the List has been Initialized
  207.                and is empty.
  208.  
  209.                Example
  210.                Var
  211.                   List : ListObj;
  212.                   LastEntryInList : EntryObj;
  213.  
  214.                Begin
  215.                   List.Init;
  216.  
  217.  
  218.           LISTS documentation                                        Page 5
  219.  
  220.  
  221.  
  222.                   ...
  223.  
  224.                   LastEntryInList:=List.LastEntry;
  225.                End.
  226.  
  227.  
  228.  
  229.                ------------------------------------------------------------
  230.                Function EntryAbs(N:LongInt):EntryPtr;
  231.                ------------------------------------------------------------
  232.                This function returns a pointer to the Nth entry in the List
  233.                starting from the first as number one.
  234.  
  235.                N must be positive.  Negative numbers will return the
  236.                FirstEntry in the List.
  237.  
  238.                If N exceeds the number of Entries in the List, EntryAbs
  239.                returns the LastEntry in the List.
  240.  
  241.                Example
  242.                Var
  243.                   List : ListObj;
  244.                   TenthEntry : EntryObj;
  245.  
  246.                Begin
  247.                   List.Init;
  248.  
  249.                   ...
  250.  
  251.                   TenthEntry:=List.EntryAbs(10);
  252.                End.
  253.  
  254.  
  255.  
  256.                ------------------------------------------------------------
  257.                Function EntryRel(Loc:EntryPtr; N:LongInt):EntryPtr
  258.                ------------------------------------------------------------
  259.                This function returns a pointer to the Nth entry relative to
  260.                Loc.
  261.  
  262.                N may be positive or negative.  If the boundaries of the
  263.                List are exceeded, a positive N value will return the
  264.                LastEntry in the List while a negative N value will return
  265.                the FirstEntry in the List
  266.  
  267.                Example
  268.                Var
  269.                   List : ListObj;
  270.                   TenthFromLast : EntryObj;
  271.  
  272.                Begin
  273.                   List.Init;
  274.  
  275.                   ...
  276.  
  277.  
  278.           LISTS documentation                                        Page 6
  279.  
  280.  
  281.  
  282.                   TenthFromLast:=List.EntryRel(List.LastEntry, -10);
  283.                End.
  284.  
  285.  
  286.  
  287.                ------------------------------------------------------------
  288.                Procedure MoveEntry(Source, Dest:EntryPtr)
  289.                ------------------------------------------------------------
  290.                This procedure moves the Source entry to the location of
  291.                immediately preceding Dest.  For example,
  292.                   Var
  293.                      L    :  ListObj;
  294.  
  295.                   Begin
  296.                      L.Init;
  297.  
  298.                      ...
  299.  
  300.                      With L Do
  301.                         MoveEntry(FirstEntry, LastEntry);
  302.                   End.
  303.                will move the FirstEntry in List, L to the next to the last
  304.                position in L.
  305.  
  306.                To move Source to the last position in the List, use NIL as
  307.                the value for Dest, for example,
  308.                   Var
  309.                      L    :  ListObj;
  310.  
  311.                   Begin
  312.                      L.Init;
  313.  
  314.                      ...
  315.  
  316.                      With L Do
  317.                         MoveEntry(FirstEntry, NIL);
  318.                   End.
  319.                Now the FirstEntry in the List has been moved to the
  320.                LastEntry and there is a new FirstEntry.
  321.  
  322.                MoveEntry performs no range checks of any sort and therefore
  323.                it is the programmer's responsibility to ensure that the
  324.                arguments to MoveEntry are both of the same list.
  325.  
  326.  
  327.           LISTS documentation                                        Page 7
  328.  
  329.  
  330.  
  331.           Section Three: EntryObj Description
  332.           -------------- --------------------
  333.           Like the ListObj, all the methods in EntryObj are virtual.
  334.  
  335.                ------------------------------------------------------------
  336.                P_Entry : EntryObj
  337.                ------------------------------------------------------------
  338.                Data field pointing to the previous entry in the List.
  339.                FirstEntry^.P_Entry points to NIL.
  340.  
  341.                Should not be accessed by the programmer, use PrevEntry
  342.                instead.
  343.  
  344.  
  345.                ------------------------------------------------------------
  346.                N_Entry : EntryObj
  347.                ------------------------------------------------------------
  348.                Data field pointing to the next entry in the List.
  349.                LastEntry^.N_Entry points to NIL.
  350.  
  351.                Should not be accessed by the programmer, use NextEntry
  352.                instead.
  353.  
  354.  
  355.                ------------------------------------------------------------
  356.                Constructor Add(Var List:ListObj);
  357.                ------------------------------------------------------------
  358.                This routine adds EntryObj into List at the end and sets up
  359.                its own Virtual Method Table.
  360.  
  361.                If the List is empty, both List.FirstEntry and
  362.                List.LastEntry point to the EntryObj.
  363.  
  364.                Example
  365.                Type
  366.                   EntryRec = Object (EntryObj) {The new object is a
  367.                                                 descendant from EntryObj,
  368.                                                 which is defined in LISTS}
  369.                                 I:Integer;
  370.                              End;
  371.  
  372.                Var
  373.                   List : ListObj;
  374.                   Entry: EntryRec;
  375.  
  376.                Begin
  377.                   List.Init;
  378.  
  379.                   Entry.I:=1;
  380.                   Entry.Add(List);
  381.                End;
  382.  
  383.  
  384.           LISTS documentation                                        Page 8
  385.  
  386.  
  387.  
  388.                ------------------------------------------------------------
  389.                Constructor Insert(Var List:ListObj; Loc:EntryPtr)
  390.                ------------------------------------------------------------
  391.                Like Add, this routine sets up the Virtual Method Table
  392.                (VMT).  Insert also inserts EntryObj into List immediately
  393.                preceding Loc, if Loc is NIL, EntryObj is added to the end
  394.                of List.
  395.  
  396.                No range checking is performed in Insert, it is the
  397.                programmer's responsibility to ensure that Loc is in the
  398.                same list as List.
  399.  
  400.                Example
  401.                Type
  402.                   EntryRec = Object (EntryObj) {The new object is a
  403.                                                 descendant from EntryObj,
  404.                                                 which is defined in LISTS}
  405.                                 I:Integer;
  406.                              End;
  407.  
  408.                Var
  409.                   List : ListObj;
  410.                   Entry: EntryRec;
  411.  
  412.                Begin
  413.                   List.Init;
  414.  
  415.                   ...
  416.  
  417.                   Entry.I:=2;
  418.                   Entry.Insert(List, List.LastEntry);
  419.                End;
  420.  
  421.  
  422.  
  423.                ------------------------------------------------------------
  424.                Destructor Remove(Var List:ListObj)
  425.                ------------------------------------------------------------
  426.                This routine removes EntryObj from List and frees up the
  427.                memory required by EntryObj's Virtual Method Table.
  428.  
  429.                Example
  430.                Type
  431.                   EntryRec = Object (EntryObj)
  432.                                 I : Integer;
  433.                              End;
  434.  
  435.                Var
  436.                   List : ListObj;
  437.                   Entries :  Array [1..10] of EntryRec;
  438.                   N : Integer;
  439.  
  440.                Begin
  441.                   List.Init;
  442.  
  443.  
  444.           LISTS documentation                                        Page 9
  445.  
  446.  
  447.  
  448.                   For N:=1 To 10 Do Begin
  449.                      Entries[N].I:=N;
  450.                      Entries[N].Add(List);
  451.                   End;
  452.  
  453.                   Entries[5].Remove(List);
  454.                End.
  455.  
  456.                At the end of the program, List would look like this:
  457.                   1   2   3   4   6   7   8   9   10
  458.  
  459.  
  460.  
  461.                ------------------------------------------------------------
  462.                Function NextEntry:EntryPtr
  463.                ------------------------------------------------------------
  464.                This routine returns the entry immediately after EntryObj.
  465.  
  466.                If the EntryObj is the LastEntry in the list, a value of NIL
  467.                is returned.
  468.  
  469.                Example
  470.                Type
  471.                   EntryRec = Object (EntryObj)
  472.                                 I : Integer;
  473.                              End;
  474.  
  475.                Var
  476.                   List : ListObj;
  477.                   Entries :  Array [1..10] of EntryRec;
  478.                   N : Integer;
  479.  
  480.                Begin
  481.                   List.Init;
  482.  
  483.                   For N:=1 To 10 Do Begin
  484.                      Entries[N].I:=N;
  485.                      Entries[N].Add(List);
  486.                   End;
  487.  
  488.                   Writeln(EntryRec(Entries[5].NextEntry^).I);
  489.                End.
  490.                This program would output a "6".
  491.  
  492.  
  493.  
  494.                ------------------------------------------------------------
  495.                Function PrevEntry:EntryPtr
  496.                ------------------------------------------------------------
  497.                This routine returns the entry immediately before EntryObj.
  498.  
  499.                If the EntryObj is the FirstEntry in the List, a value of
  500.                NIL is returned.
  501.  
  502.  
  503.           LISTS documentation                                       Page 10
  504.  
  505.  
  506.  
  507.                Example
  508.                Type
  509.                   EntryRec = Object (EntryObj)
  510.                                 I : Integer;
  511.                              End;
  512.  
  513.                Var
  514.                   List : ListObj;
  515.                   Entries :  Array [1..10] of EntryRec;
  516.                   N : Integer;
  517.  
  518.                Begin
  519.                   List.Init;
  520.  
  521.                   For N:=1 To 10 Do Begin
  522.                      Entries[N].I:=N;
  523.                      Entries[N].Add(List);
  524.                   End;
  525.  
  526.                   Writeln(EntryRec(Entries[5].PrevEntry^).I);
  527.                End.
  528.                This program would output a "4".
  529.  
  530.  
  531.           LISTS documentation                                       Page 11
  532.  
  533.  
  534.  
  535.           Examples
  536.           --------
  537.           The following examples will hopefully make the use of LISTS a bit
  538.           clearer.
  539.  
  540.  
  541.                Static Entries
  542.                --------------
  543.                Occasionally it might be useful to have static entries in a
  544.                List, that is to have the entries declared in the VAR
  545.                section of the program.  The above examples are examples of
  546.                static entries.
  547.  
  548.                To make use of static entries, simply define the TYPE of the
  549.                entry as an object which is descendant of EntryObj, for
  550.                example,
  551.                   Type
  552.                      EntryRec   =   Object (EntryObj) {Descendant from
  553.                                                        EntryObj}
  554.                                        Name:String[30];
  555.                                     End;
  556.  
  557.                Then, in the VAR section, declare variables to be of type
  558.                EntryRec which then can become part of a List.  For example,
  559.                   Var
  560.                      Entry1, Entry2, Entry3  :   EntryRec;
  561.                      NameList                :   ListObj;
  562.                      P                       :   EntryPtr;
  563.  
  564.                   Begin
  565.                      NameList.Init;
  566.  
  567.                      Write('Enter first name:'); Readln(Entry1.Name);
  568.                      Write('Enter second name:'); Readln(Entry2.Name);
  569.                      Write('Entry third name:'); Readln(Entry3.Name);
  570.  
  571.                      Entry1.Add(NameList);
  572.                      Entry2.Add(NameList);
  573.                      Entry3.Add(NameList);
  574.  
  575.                      Writeln('The following is the REVERSED list of
  576.                names.');
  577.  
  578.                      P:=NameList.LastEntry;
  579.                      While Not (P=nil) Do Begin
  580.                         Writeln(EntryRec(P^).Name);
  581.  
  582.                         P:=P^.PrevEntry;
  583.                      End;
  584.                   End.
  585.  
  586.  
  587.           LISTS documentation                                       Page 12
  588.  
  589.  
  590.  
  591.                Dynamic entries
  592.                ---------------
  593.                Infinitely more useful than Static entries are Dynamic
  594.                entries.  These entries use the heap to store the
  595.                information contained in the List.
  596.  
  597.                Below is the above example written to use Dynamic entries.
  598.                Notice that in the output section, after displaying the
  599.                name, the program removes the Entry from the List and then
  600.                removes the Entry from the heap.
  601.                   Type
  602.                      EntryRec   =   Object (EntryObj) {Descendant from
  603.                                                        EntryObj}
  604.                                        Name:String[30];
  605.                                     End;
  606.  
  607.                   Var
  608.                      Entry                   :   ^EntryRec;
  609.                      Name                    :   String[30];
  610.                      NameList                :   ListObj;
  611.                      P                       :   EntryPtr;
  612.  
  613.                   Begin
  614.                      NameList.Init;
  615.  
  616.                      Writeln('Enter names, blank line to stop.');
  617.  
  618.                      Repeat
  619.                         Readln(Name);
  620.                         If Not (Name='') Then Begin
  621.                            New(Entry, Add(NameList));
  622.                            Entry^.Name:=Name;
  623.                         End;
  624.                      Until Name='';
  625.  
  626.                      Writeln('The following is the REVERSED list of
  627.                names.');
  628.  
  629.                      P:=NameList.LastEntry;
  630.                      While Not (P=nil) Do Begin
  631.                         Writeln(EntryRec(P^).Name);
  632.  
  633.                         Entry:=P;
  634.                         P:=P^.PrevEntry;
  635.  
  636.                         Dispose(Entry, Remove);
  637.                      End;
  638.                   End.
  639.  
  640.           IMPORTANT NOTE:
  641.           Due to the nature of LISTS, each Entry into the List must be
  642.           descended from EntryObj.
  643.  
  644.  
  645.           LISTS documentation                                       Page 13
  646.  
  647.  
  648.  
  649.           Hopes
  650.           -----
  651.           I hope you find LISTS both useful and productive.  If you have
  652.           any questions or comments regarding the program, please address
  653.           them to Mark Addleman via CompuServe (CIS number - 72777, 740)
  654.  
  655.           Thank you very much.
  656.